\documentclass[a4paper,10pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[spanish]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{verbatim}
\usepackage{hyperref}

\usepackage{anysize}
\marginsize{1.5cm}{1.5cm}{1cm}{1cm}

%\usepackage{sectsty}
%\sectionfont{\Large}

\pdfinfo{%
  /Title    (Pre-entrega Trabajo Práctico Especial)
  /Author   ()
  /Creator  ()
  /Producer ()
  /Subject  ()
  /Keywords ()
}

\begin{document}

\begin{titlepage}
\begin{center}
 \huge \underline{\textbf{Pre-entrega Trabajo Práctico Especial}}\\[0.05cm]
 \normalsize \textbf{Protocolos de Comunicación}\\[1cm]

\large
\begin{tabular}{c @{ - } l}
 Andrés Mata Suarez & 50143 \\
 Jimena Pose & 49015 \\
 Pablo Ballesty & 49359 \\
\end{tabular}\\[21.4cm]
 2011 - Segundo cuatrimestre
\end{center}

\end{titlepage}

\setcounter{tocdepth}{2}
\tableofcontents


\newpage
\section{Documentación relevante para el desarrollo}

Para el análsis del trabajo práctico se utilizan los siguientes documentos
\begin{itemize}
 \item RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core
 \item RFC 6121: Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence
 \item RFC 6122: Extensible Messaging and Presence Protocol (XMPP): Address Format
 \item XEP 0096: SI File Transfer
\end{itemize}

Posiblemente sean necesarios los siguientes
\begin{itemize}
 \item RFC 4854: A Uniform Resource Name (URN) namespace for use in XMPP extensions
 \item RFC 5246:  The Transport Layer Security (TLS) Protocol Version 1.2
 \item RFC 2222: Simple Authentication and Security Layer (SASL)
\end{itemize}


\section{Protocolos a desarrollar}
A continuación se presenta el RFC del protocolo \textit{configurotocol 1.0}, diseñado para manejar la configuración
del servidor proxy.

\verbatiminput{configurotocol.txt}

\section{Potenciales problemas y dificultades}

\subsection{Comunicación encriptada}
Como se especifica en el RFC 6120, cuando dos entidades quieren comunicarse, primero negocian qué método de encriptación utilizarán, es decir, el server manda sus \textit{features}
y el cliente avisa cuál utilizará. Luego, comienzan nuevamente la sesión, utilizando el método escogido.
\par Para el servidor proxy, esto es sin dudas un problema: luego de que ambas entidades escojan un protocolo de encriptación (los dos que se mencionan
son TLS y SASL) los paquetes comienzan a viajar encriptados y por ende, se vuelve dificultosa la implementación de algunos de los requerimientos que se piden (en especial los de transformaciones de datos, como es el filtro de l33t).
\par Para evitar la llegada de paquetes asegurados al proxy, se decide que una vez negociado el método a utilizar por las dos entidades, el server proxy abrirá dos endpoints de conexión, uno para cada extremo del intercambio, de manera tal que sepa encriptar y desencriptar los mensajes de cada
parte de la conexión. Ejemplificando, si quiere reenviar todo lo recibido del cliente al servidor, previamente deberá desencriptarlo y luego volver a encriptarlo.

\subsection{Transparencia}
El proxy XMPP a desarrollar debería actuar de manera completamente invisible frente a cada par de entidades (cliente y servidor) conectadas.
En otras palabras, el flujo de información que envía una parte debería arribar sin ningún tipo de alteración al otro extremo
de la conexión, siempre y cuando no estén activas ninguna de las funciones de transformación ofrecidas por la aplicación. Por su parte, el resto
de los requerimientos funcionales no deberían modificar en lo más mínimo el \textit{stream} XML enviado entre pares.

\subsection{Concurrencia}
Uno de los problemas que deberá enfrentar el server proxy es una cantidad grande de conexiones, es decir, atender a grandes cantidades de clientes.
Mas allá, que este problema se puede paliar planteando una arquitectura con varios servidores proxies, e ir balanceando la concurrencia, la idea es que 
además cada servidor proxy maneje de manera performante la concurrencia, y pueda servir la mayor cantidad de clientes. Para esto, dentro de lo posible se
intentará utilizar \textit{N} selectores cada uno corriendo en un \textit{Thread}, siendo \textit{N} la cantidad de procesadores que tenga el host donde se corra la aplicación, y se van a ir asignando
sockets a cada selector mediante un algoritmo Round-Robin. Se ponen \textit{N} \textit{Threads} igual a la cantidad de procesadores, para que, en lo posible
corran en paralelo realmente, y no perder tiempo de \textit{scheduling}.


% Frente a cantidades superlativas de conexiones, el proxy debería estar diseñado para trabajar de manera performante, optimizando el manejo de hilos de ejecución.
% Para tal fin, se opta por la implementación de un patrón de \textit{pool} de \textit{threads}. La creación atolondrada de \textit{threads} podría consumir demasiados recursos
% en un período relativamente corto de tiempo; por el contrario, la constante reutilización de hilos de ejecución para nuevas conexiones podría provocar un verdadero
% cuello de botella en la performance y el tiempo de ejecución de la aplicación. El objetivo de este inciso radica en encontrar el balance correcto entre la creación y reutilización de threads,
% de tal manera que el sistema funcione en condiciones óptimas.
% 
% Por supuesto, la destrucción criteriosa de hilos inactivos es un factor tan importante como sendos anteriores. De más está decir que el consumo de recursos del sistema debería
% ser el mínimo posible.

\subsection{Manejo de grandes \textit{streams} de información}
Los \textit{streams} de información que se consideren de gran tamaño deben ser almacenados temporalmente en disco. Obviar esta política implicaría riesgo de agotación de la memoria y, en consecuencia,
la pérdida de la estabilidad deseada en la aplicación. Debido a esto, es necesario implementar un módulo eficiente con la función de mantener ciertos \textit{streams}
en disco e ir llevándolos a memoria a medida que sea necesario. La aplicación no debería dejar de funcionar (o comenzar a funcionar erráticamente) debido al tamaño de los
\textit{streams} que se manejen.

De nuevo, se espera que el manejo de recursos sea eficiente: no es deseable la creación excesiva de archivos en disco así como tampoco lo es la no eliminación de archivos que ya no están en uso
por la aplicación.

\subsection{Controles y aplicaciones externas}
En caso de que algún control efectuado por la aplicación de proxy (por ej.: control de accesos) tenga efecto sobre cierta entidad en una conexión, el mensaje de error devuelto deberá tener
la forma de un mensaje de error XMPP. Una aplicación externa que utilize el proxy no debería tener motivos para sospechar que un error del tipo mencionado no proviene del otro
\textit{endpoint} de conexión.


\section{Ambiente de desarrollo y testing}
La aplicación será desarrollada bajo entorno Unix/Linux.\\

Para la realización de testeos de unidad, se utilizará el framework \textbf{JUnit} (\url{http://www.junit.org/}).\\

Para testeos de carga (\textit{stress-testing}), se utilizará la aplicación \textbf{JMeter} (\url{http://jakarta.apache.org/jmeter/}).\\

Como servidor de XMPP se utilizará \textbf{ejabberd} (\url{http://www.ejabberd.im/}); el mismo puede instalarse en Ubuntu directamente desde los repositorios 
ejecutando desde consola:
\begin{verbatim}
 sudo apt-get install ejabberd
\end{verbatim}
\par Como cliente se utilizará \textbf{Pidgin} (\url{http://www.pidgin.im/}); el mismo puede instalarse en Ubuntu directamente de los respositorios ejecutando 
desde consola:
\begin{verbatim}
 sudo apt-get install pidgin
\end{verbatim}

\section{Casos de prueba a realizar}
Para la ejecución de los casos de prueba, se va a contar con los siguientes usuarios:
\begin{itemize}
 \item \textbf{foo} con contraseña \textbf{123123123}
 \item \textbf{bar} con contraseña \textbf{123123123}
 \item \textbf{baz} con contraseña \textbf{123123123}
 \item \textbf{foobar} con contraseña \textbf{123123123}
\end{itemize}

\subsection{Testeos de requerimientos funcionales}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por rango de horarios\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para exigir que el usuario
					\textbf{foo} sólo pueda acceder de 6:00 a 18:00 horas. Iniciar sesión con
					dicho usuario en dicho rango horario.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{foo} inicia sesión sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por rango de horarios\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para exigir que el usuario
					\textbf{foo} sólo pueda acceder de 6:00 a 18:00 horas. Iniciar sesión con
					dicho usuario fuera de ese rango horario.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{foo} no tiene permitido el inicio de sesión en dicho
					rango horario. Se recibe un error acorde al protocolo.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por rango de horarios\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para exigir que el usuario
					\textbf{foo} sólo pueda acceder de 19:00 a 06:00 horas. Iniciar sesión con
					dicho usuario dentro de ese rango horario.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{foo} no tiene permitido el inicio de sesión en dicho
					rango horario. Se recibe un error acorde al protocolo. Que el configurotocol permita este seteo.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por cantidad de logins exitosos por usuario y día\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Asegurarse de que el usuario \textbf{bar} no haya iniciado sesión
					anteriormente en el día.
					Utilizar el protocolo \textit{configurotocol} para exigir que el usuario
					\textbf{bar} sólo pueda acceder al sistema un máximo de 1 (una) vez
					por día. Iniciar sesión en el sistema como dicho usuario.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{bar} inicia sesión sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por cantidad de logins exitosos por usuario y día\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Asegurarse de que el usuario \textbf{bar} no haya iniciado sesión
					anteriormente en el día.
					Utilizar el protocolo \textit{configurotocol} para exigir que el usuario
					\textbf{bar} sólo pueda acceder al sistema un máximo de 1 (una) vez
					por día. Iniciar sesión en el sistema como dicho usuario. Cerrar sesión.
					Iniciar sesión una vez más.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{bar} ya cumplió su cuota diaria de accesos.
					El segundo login no es aceptado. Se devuelve mensaje de error acorde al protocolo.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por lista negra (dirección IP)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para impedir conexiones
					entrantes de la dirección 192.168.1.50. Iniciar sesión como
					\textbf{baz} desde la dirección 192.168.1.51.\\
    \hline
    \textbf{Resultado esperado}	&	El usuario \textbf{baz} inicia sesión sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por lista negra (dirección IP)\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para impedir conexiones
					entrantes de la dirección 192.168.1.50. Iniciar sesión como
					\textbf{baz} desde la dirección 192.168.1.50.\\
    \hline
    \textbf{Resultado esperado}	&	La dirección 192.168.1.50 se encuentra en la lista negra. No se permite
					el inicio de sesión. Se devuelve mensaje de error acorde al protocolo.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por lista negra (redes IP)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para impedir conexiones
					entrantes del rango de direcciones 192.168.1.0/25. Iniciar sesión como
					\textbf{foobar} desde la dirección 192.168.1.130. Iniciar sesión como
					\textbf{baz} desde la dirección 192.168.1.254.\\
    \hline
    \textbf{Resultado esperado}	&	Ambos usuarios inician sesión sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por lista negra (redes IP)\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para impedir conexiones
					entrantes del rango de direcciones 192.168.1.0/25. Iniciar sesión como
					\textbf{foobar} desde la dirección 192.168.1.126. Iniciar sesión como
					\textbf{bar} desde la dirección 192.168.1.10.\\
    \hline
    \textbf{Resultado esperado}	&	No se permite ninguno de los dos inicios de sesión. Se devuelven mensajes
					acordes para cada instancia de la aplicación.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por cantidad de sesiones concurrentes\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para restringir la cantidad
					máxima de sesiones concurrentes del usuario \textbf{baz} a 3.
					Iniciar sesión como dicho usuario desde 2 clientes distintos.\\
    \hline
    \textbf{Resultado esperado}	&	Se permite el inicio de sesión en cada instancia del programa.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por cantidad de sesiones concurrentes\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para restringir la cantidad
					máxima de sesiones concurrentes del usuario \textbf{baz} a 3.
					Iniciar sesión como dicho usuario desde 3 clientes
					distintos. Utilizar un nuevo cliente e iniciar sesión nuevamente.\\
    \hline
    \textbf{Resultado esperado}	&	Se permite el inicio de sesión en el último cliente, y el primer cliente
					que se utilizó se desconecta recibiendo un error acorde al protocolo.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por silenciamiento de usuarios\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para asegurarse de que el usuario
					\textbf{foobar} no se encuentre silenciado. Iniciar sesión como dicho
					usuario y emitir mensajes hacia el usuario \textbf{foo} que estará conectado.
					Luego el usuario \textbf{foo} emite mensajes hacia \textbf{foobar}.\\
    \hline
    \textbf{Resultado esperado}	&	Los usuarios se comunican sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Por silenciamiento de usuarios\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Utilizar el protocolo \textit{configurotocol} para silenciar al usuario
					\textbf{foobar}. Iniciar sesión como dicho usuario y emitir mensajes hacia
					el usuario \textbf{foo} que estará conectado.
					Luego \textbf{foo} envía mensajes hacia \textbf{foobar} y hacia \textbf{bar}.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{foo} y \textbf{foobar} no pueden comunicarse, y \textbf{bar} recibe los mensajes de \textbf{foo}.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Filtros(L33t)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Mediante \textit{configurotocol} activar el filtro de \textbf{L33t}. 
					Emitir mensajes desde \textbf{foo} hacia \textbf{bar} que posean vocales.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} recibe los mensajes en formato \textbf{L33t}.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Filtros(L33t)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Mediante \textit{configurotocol} activar el filtro de \textbf{L33t}. 
					Emitir mensajes desde \textbf{foo} hacia \textbf{bar} que posean vocales.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} recibe los mensajes en formato \textbf{L33t}.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Filtros(Hash)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Mediante \textit{configurotocol} activar el filtro de \textbf{Hash}. 
					Enviar un archivo desde \textbf{foo} hacia \textbf{bar}. Asegurarse que 
					se envía el hash correspondiente.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} recibe el archivo sin problemas, con el hash generado.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Filtros(Hash)\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Mediante \textit{configurotocol} activar el filtro de \textbf{Hash}. 
					Enviar un archivo desde \textbf{foo} hacia \textbf{bar}. Quitar el hash del mensaje.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} recibe el archivo sin problemas, con el hash generado.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Funcionalidad}	&	Filtros(Hash)\\
    \hline
    \textbf{Tipo de test}	&	Negativo\\
    \hline
    \textbf{Descripción}	&	Mediante \textit{configurotocol} activar el filtro de \textbf{Hash}. 
					Enviar un archivo desde \textbf{foo} hacia \textbf{bar}. Alterar el hash.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} no recibe el archivo.\\
    \hline   
  \end{tabular}
\end{center}

\subsection{Testeos de requerimientos no funcionales}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Requerimiento no funcional}	& Envío de archivos\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Desde el usuario \textbf{foo} enviar un archivo a \textbf{bar} de un tamaño de 30Mb.\\
    \hline
    \textbf{Resultado esperado}	&	\textbf{bar} recibe el archivo sin problemas.\\
    \hline   
  \end{tabular}
\end{center}

\begin{center}
  \begin{tabular}{|r|p{12.5cm}|}
    \hline
    \textbf{Requerimiento no funcional}	& Concurrencia\\
    \hline
    \textbf{Tipo de test}	&	Positivo\\
    \hline
    \textbf{Descripción}	&	Configurar JMeter para que realice \textit{n} conexiones al servidor proxy y emita mensajes.
					Ir aumentando \textit{n}.\\
    \hline
    \textbf{Resultado esperado}	&	Para n aceptable (analizaremos durante el desarrollo cuanto sería un n aceptable) no se rechazan conexiones y pueden emitirse los mensajes.\\
    \hline   
  \end{tabular}
\end{center}

\end{document}
